package main

/*
1、MPG模式基本介绍
(1)M：操作系统的主线程（是物理线程）
(2)P：协程执行需要的上下文
(3)G：协程
2、MPG模式运行的状态1
(1)当前程序有三个M，如果三个M都在一个cpu运行，就是并发，如果在不同的cpu运行就是并行
(2)M1、M2、M3正在执行G，M1的协程队列有三个，M2的协程队列有三个，M3的协程队列有两个
(3)Go的协程是轻量级的线程，是逻辑态，Go可以容易地起上万个协程
(4)其它程序c/java的多线程，往往都是内核态的，比较重量级，几千个线程可能耗光cpu
3、MPG模式运行的状态3
(1)分成两部分来看
(2)原来的情况是M0主线程正在执行Go协程，另外有三个协程在队列等待
(3)如果Go协程阻塞，比如读取文件或数据库等
(4)这时就会创建M1主线程(也可能是从已有的线程池中取出M1)，并且将等待的3个协程挂到M1下开始执行，M0的主线程下的Go仍然执行文件io的读写
(5)这样的MPG调度模式，可以既让Go执行，同时也不会让队列的其它协程一直阻塞，仍然可以并发/并行执行
(6)等到Go不阻塞了，M0会被放到空闲的主线程继续执行（从已有的线程池中取），同时go又会被唤醒
*/
